from django.apps import AppConfig
import threading
import time
from datetime import datetime, timedelta
from django.conf import settings
from django.core.mail import send_mail

class ToolsConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'tools'
    verbose_name = '工具管理'

    def ready(self):
        if settings.DEBUG:
            # 在开发环境中，我们只在主进程中启动定时任务
            # 避免在自动重载时启动多个线程
            import os
            if os.environ.get('RUN_MAIN') == 'true':
                self.start_scheduler()
        else:
            # 在生产环境中直接启动
            self.start_scheduler()

    def start_scheduler(self):
        """
        启动定时任务调度器
        """
        scheduler_thread = threading.Thread(target=self.run_scheduler, daemon=True)
        scheduler_thread.start()

    def run_scheduler(self):
        """
        运行定时任务，每周一早上8点执行检查
        """
        # 等待Django完全启动
        time.sleep(10)
        self.check_tool_expirations()
        
        while True:
            try:
                # 计算到下一个周一早上8点的时间
                now = datetime.now()
                days_ahead = 0  # 0=周一, 1=周二, ..., 6=周日
                
                # 如果今天是周一且已经过了8点，则下次执行是下周一
                if now.weekday() == 0 and now.hour >= 8:
                    days_ahead = 7
                else:
                    # 计算到下一个周一还有几天
                    days_ahead = (7 - now.weekday()) % 7
                
                # 计算下次执行时间（周一早上8点）
                next_run = now.replace(hour=8, minute=0, second=0, microsecond=0) + timedelta(days=days_ahead)
                
                # 计算睡眠时间（秒）
                sleep_seconds = (next_run - now).total_seconds()
                
                # 等待到下次执行时间
                if sleep_seconds > 0:
                    time.sleep(sleep_seconds)
                
                # 执行检查工具过期的命令
                self.check_tool_expirations()
                
                # 执行完后等待一段时间避免重复执行
                time.sleep(60)
                
            except Exception as e:
                print(f"执行定时任务时出错: {e}")
                # 出错后等待1小时再试
                time.sleep(3600)

    def check_tool_expirations(self):
        """
        检查工具过期状态，对即将过期的工具发送提醒邮件
        """
        try:
            from .models import Tool
            
            # 获取所有快过期的工具
            expiring_tools = Tool.objects.filter(is_active=True)
            expiring_tools = [tool for tool in expiring_tools if tool.status == 'expiring_soon']
            
            print(f'找到 {len(expiring_tools)} 个即将过期的工具')
            
            # 对每个快过期的工具发送邮件提醒
            for tool in expiring_tools:
                if tool.owner and tool.owner.email:
                    try:
                        self.send_expiration_reminder(tool)
                        print(f'已发送提醒邮件给 {tool.owner.username} 关于工具 "{tool.name}"')
                    except Exception as e:
                        print(f'发送邮件给 {tool.owner.username} 失败: {str(e)}')
                else:
                    print(f'工具 "{tool.name}" 没有指定所有人或所有人没有邮箱地址')
            
            print('工具过期检查完成')
            
        except Exception as e:
            print(f'检查工具过期状态时出错: {str(e)}')

    def send_expiration_reminder(self, tool):
        """
        发送过期提醒邮件
        """
        subject = f'工具即将过期提醒 - {tool.name}'
        message = f'''
您好 {tool.owner.username}，

您负责的工具 "{tool.name}" 即将过期。

工具信息：
- 名称: {tool.name}
- 校准日期: {tool.calibrated_date}
- 过期日期: {tool.expiration_date}
- 剩余天数: {tool.days_until_expiration} 天

请尽快处理该工具的校准或更换事宜。

此邮件由系统自动发送，请勿回复。
        '''
        
        send_mail(
            subject,
            message,
            settings.DEFAULT_FROM_EMAIL,
            [tool.owner.email],
            fail_silently=False,
        )